package git.soulbgm.config;

import git.soulbgm.utils.SpringBeanUtil;
import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.context.annotation.Configuration;

import java.time.Duration;
import java.util.LinkedHashMap;
import java.util.Map;

/**
 * 系统配置
 *
 * @author SoulBGM
 * @date 2022-12-29
 */
@Configuration
@ConfigurationProperties(prefix = "config", ignoreUnknownFields = false)
public class SysConfig {

    /**
     * 是否是debug模式
     */
    private boolean debug = false;

    /**
     * 是否在debug模式打印具体数据
     */
    private boolean debugData = false;

    /**
     * 主机运行资源使用情况信息保留时间 默认2小时
     * 数字后面的单位如下：（不写单位默认为毫秒）
     * ms 毫秒
     * s  秒
     * m  分钟
     * h  时
     * d  天
     */
    private Duration nodeUsedRetentionTime = Duration.ofHours(2);

    /**
     * 区域编号 0代表不区分区域 其他为自定义
     */
    private Integer regionCode;

    /**
     * 监控数据监听端口
     */
    private int monitorPort;

    /**
     * 需备份表数据的表名
     */
    private Map<String, String> backupTables;

    /**
     * 初始化数据路径(必须放到工作目录空间 在idea中为 项目根目录 部署后在 jar包同级目录)
     * 默认为 工作目录空间下的 sql/init_data.sql
     */
    private String initDataPath = "sql/init_data.sql";

    /**
     * 是否将初始数据覆盖原本的表数据
     * 默认为 false
     */
    private boolean tableDataOverwrite = false;

    private static SysConfig config;

    /**
     * 获取SysConfig
     *
     * @return {@link SysConfig}
     */
    public static SysConfig getConfig() {
        if (config == null) {
            config = SpringBeanUtil.getBean(SysConfig.class);
        }
        return config;
    }

    public boolean isDebug() {
        return debug;
    }

    public void setDebug(boolean debug) {
        this.debug = debug;
    }

    public boolean isDebugData() {
        return debugData;
    }

    public void setDebugData(boolean debugData) {
        this.debugData = debugData;
    }

    public Duration getNodeUsedRetentionTime() {
        return nodeUsedRetentionTime;
    }

    public void setNodeUsedRetentionTime(Duration nodeUsedRetentionTime) {
        this.nodeUsedRetentionTime = nodeUsedRetentionTime;
    }

    public Integer getRegionCode() {
        return regionCode;
    }

    public void setRegionCode(Integer regionCode) {
        this.regionCode = regionCode;
    }

    public int getMonitorPort() {
        return monitorPort;
    }

    public void setMonitorPort(int monitorPort) {
        this.monitorPort = monitorPort;
    }

    public void setBackupTables(Map<String, String> backupTables) {
        this.backupTables = backupTables;
    }

    public Map<String, String> getBackupTables() {
        return backupTables;
    }

    public void setBackupTables(LinkedHashMap<String, String> backupTables) {
        this.backupTables = backupTables;
    }

    public String getInitDataPath() {
        return initDataPath;
    }

    public void setInitDataPath(String initDataPath) {
        this.initDataPath = initDataPath;
    }

    public boolean isTableDataOverwrite() {
        return tableDataOverwrite;
    }

    public void setTableDataOverwrite(boolean tableDataOverwrite) {
        this.tableDataOverwrite = tableDataOverwrite;
    }
}
